#ifndef __MVT_GETOPT_H__
#define __MVT_GETOPT_H__

#ifdef __cplusplus
extern "C"
{
#endif

#include "mvdef.h"

typedef struct _mvt_opt_attr {
    mv_cv8ptr_t      cpv8_name;   /* 长名字 */
    mv_v8_t          v8_tag;      /* 缩写字符 */
    mv_u8_t          u8_opt_bmpc8;/* 选项属性[mvt_getopt_bmpc8_e] */
}mvt_opt_attr_t;

typedef struct _mvt_getopt {
    mv_s32_t         s32_argc;
    mv_v8_t        **ppv8_argv;
    mvt_opt_attr_t  *pst_opt_attr;   /* 最后一个必须全为NULL */
    mv_s32_t         s32_opts;       /* opt 数量*/
    mv_s32_t         s32_arg_type;   /* 当前解析的是长名(2)还是短名(1) */
    mv_s32_t         s32_arg_idx;    /* 下次解析的参数下标 */
    mv_s32_t         s32_chr_idx;    /* 当前字符串处理下标 */
}mvt_getopt_t;

typedef enum _opt_case {
    OPT_NONE           = 0,
    OPT_STRCASE        = 1, ///< 大小写通配
    OPT_WITH_ARG_VALUE = 2, ///< 参数后接变量' '连接（单独占一个arg）
    ///< 暂时不支持'='连接的参数
}mvt_getopt_prop_bmpc8_e;

/**
 * @brief option解析
 * 
 * @param pst_opt    [in]  option上下文
 * @param ppv8_value [out] 当前arg的value结果（如果存在的话，指向argv的内存）
 * @return 当次解析结果
 * - success : opt attr列表对应选项下标
 * -  failed : MV_EC_IGNORE (当次调用解析arg非法，忽略此入参)
 *             MV_EC_EOF    (解析到末尾)
 *
 * @note 按顺序每次调用解析一个arg
 */
mv_s32_t mvt_getopt(mvt_getopt_t *pst_opt, mv_v8ptr_t *ppv8_value);
/**
 * @brief option检查
 * 
 * @param pst_opt    [in]  option上下文
 * @return 检查结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_INVALID_ARGS
 *
 * @note 主要用来需要确保所有入参都是能符合设定要求格式的时候，提前检查调用，非必须
 */
mv_s32_t mvt_getopt_inchk(mvt_getopt_t *pst_opt);

#ifdef __cplusplus
}
#endif
#endif